package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.dto.VisaMaterialRequirementDTO;
import com.sky.dto.VisaMaterialRequirementPageQueryDTO;
import com.sky.entity.VisaMaterialRequirement;
import com.sky.entity.VisaProduct;
import com.sky.mapper.VisaMaterialRequirementMapper;
import com.sky.result.PageResult;
import com.sky.service.VisaMaterialRequirementService;
import com.sky.service.VisaProductService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Service
public class VisaMaterialRequirementServiceImpl implements VisaMaterialRequirementService {
    private static final Logger log = LoggerFactory.getLogger(VisaMaterialRequirementServiceImpl.class);

    @Autowired
    private VisaMaterialRequirementMapper visaMaterialRequirementMapper;

    @Autowired
    private VisaProductService visaProductService;

    /**
     * 新增签证材料要求
     * @param visaMaterialRequirementDTO
     */
    @Override
    public void insert(VisaMaterialRequirementDTO visaMaterialRequirementDTO) {
        log.info("开始新增签证材料要求，接收到的DTO: {}", visaMaterialRequirementDTO);
        
        VisaMaterialRequirement visaMaterialRequirement = new VisaMaterialRequirement();
        BeanUtils.copyProperties(visaMaterialRequirementDTO, visaMaterialRequirement);
        
        log.info("转换后的实体对象: productId={}, productName={}", 
                visaMaterialRequirement.getProductId(), visaMaterialRequirement.getProductName());
        
        // 强制设置productId：如果前端没有传递productId，则根据productName查找
        if (visaMaterialRequirement.getProductId() == null && visaMaterialRequirement.getProductName() != null) {
            log.info("productId为空，开始根据productName查找对应的产品ID");
            // 根据产品名称查找对应的产品ID
            try {
                // 获取所有启用的产品列表
                List<VisaProduct> products = visaProductService.getAllEnabledProducts();
                log.info("获取到{}个启用的产品", products.size());
                
                // 根据产品名称查找对应的产品
                VisaProduct matchedProduct = products.stream()
                    .filter(product -> product.getName().equals(visaMaterialRequirement.getProductName()))
                    .findFirst()
                    .orElse(null);
                
                if (matchedProduct != null) {
                    visaMaterialRequirement.setProductId(matchedProduct.getId());
                    log.info("根据产品名称找到对应的产品ID: {} -> {}", visaMaterialRequirement.getProductName(), matchedProduct.getId());
                } else {
                    log.warn("无法根据产品名称找到对应的产品ID: {}", visaMaterialRequirement.getProductName());
                }
            } catch (Exception e) {
                log.error("查找产品ID时发生错误: {}", e.getMessage());
            }
        } else if (visaMaterialRequirement.getProductId() != null) {
            log.info("productId已设置: {}", visaMaterialRequirement.getProductId());
        } else {
            log.warn("productId和productName都为空");
        }
        
        log.info("最终保存的实体对象: productId={}, productName={}", 
                visaMaterialRequirement.getProductId(), visaMaterialRequirement.getProductName());
        
        // 打印所有字段的值
        log.info("准备插入的数据: id={}, productId={}, productName={}, userType={}, materialName={}, materialDetail={}, isRequired={}, sortOrder={}", 
                visaMaterialRequirement.getId(),
                visaMaterialRequirement.getProductId(),
                visaMaterialRequirement.getProductName(),
                visaMaterialRequirement.getUserType(),
                visaMaterialRequirement.getMaterialName(),
                visaMaterialRequirement.getMaterialDetail(),
                visaMaterialRequirement.getIsRequired(),
                visaMaterialRequirement.getSortOrder());
        
        visaMaterialRequirement.setCreateTime(LocalDateTime.now());
        visaMaterialRequirement.setUpdateTime(LocalDateTime.now());
        
        try {
            visaMaterialRequirementMapper.insert(visaMaterialRequirement);
            log.info("数据插入成功，新记录的ID: {}", visaMaterialRequirement.getId());
        } catch (Exception e) {
            log.error("数据插入失败: {}", e.getMessage(), e);
            throw e;
        }
    }

    /**
     * 修改签证材料要求
     * @param visaMaterialRequirementDTO
     */
    @Override
    public void update(VisaMaterialRequirementDTO visaMaterialRequirementDTO) {
        VisaMaterialRequirement visaMaterialRequirement = new VisaMaterialRequirement();
        BeanUtils.copyProperties(visaMaterialRequirementDTO, visaMaterialRequirement);
        
        // 如果没有设置productId，根据productName查找对应的productId
        if (visaMaterialRequirement.getProductId() == null && visaMaterialRequirement.getProductName() != null) {
            // 根据产品名称查找对应的产品ID
            try {
                // 获取所有启用的产品列表
                List<VisaProduct> products = visaProductService.getAllEnabledProducts();
                // 根据产品名称查找对应的产品
                VisaProduct matchedProduct = products.stream()
                    .filter(product -> product.getName().equals(visaMaterialRequirement.getProductName()))
                    .findFirst()
                    .orElse(null);
                
                if (matchedProduct != null) {
                    visaMaterialRequirement.setProductId(matchedProduct.getId());
                    log.info("根据产品名称找到对应的产品ID: {} -> {}", visaMaterialRequirement.getProductName(), matchedProduct.getId());
                } else {
                    log.warn("无法根据产品名称找到对应的产品ID: {}", visaMaterialRequirement.getProductName());
                }
            } catch (Exception e) {
                log.error("查找产品ID时发生错误: {}", e.getMessage());
            }
        }
        
        visaMaterialRequirement.setUpdateTime(LocalDateTime.now());
        visaMaterialRequirementMapper.update(visaMaterialRequirement);
    }

    /**
     * 删除签证材料要求
     * @param id
     */
    @Override
    public void delete(Long id) {
        visaMaterialRequirementMapper.delete(id);
    }

    /**
     * 分页查询签证材料要求
     * @param visaMaterialRequirementPageQueryDTO
     * @return
     */
    @Override
    public PageResult page(VisaMaterialRequirementPageQueryDTO visaMaterialRequirementPageQueryDTO) {
        PageHelper.startPage(visaMaterialRequirementPageQueryDTO.getPage(), visaMaterialRequirementPageQueryDTO.getPageSize());
        Page<VisaMaterialRequirement> page = visaMaterialRequirementMapper.page(visaMaterialRequirementPageQueryDTO);
        return new PageResult(page.getTotal(), page.getResult());
    }

    /**
     * 根据ID查询签证材料要求
     * @param id
     * @return
     */
    @Override
    public VisaMaterialRequirement selectById(Long id) {
        return visaMaterialRequirementMapper.selectById(id);
    }

    /**
     * 根据产品名称查询签证材料要求列表
     * @param productName
     * @return
     */
    @Override
    public List<VisaMaterialRequirement> selectByProductName(String productName) {
        return visaMaterialRequirementMapper.selectByProductName(productName);
    }

    /**
     * 根据产品名称和用户类型查询签证材料要求列表
     * @param productName
     * @param userType
     * @return
     */
    @Override
    public List<VisaMaterialRequirement> selectByProductNameAndUserType(String productName, String userType) {
        // 如果用户类型为空，返回所有材料要求
        if (userType == null || userType.trim().isEmpty()) {
            log.info("用户类型为空，返回产品 {} 的所有材料要求", productName);
            return visaMaterialRequirementMapper.selectByProductName(productName);
        }
        log.info("根据产品名称 {} 和用户类型 {} 查询材料要求", productName, userType);
        return visaMaterialRequirementMapper.selectByProductNameAndUserType(productName, userType);
    }

    /**
     * 根据产品ID查询签证材料要求列表
     * @param productId
     * @return
     */
    @Override
    public List<VisaMaterialRequirement> selectByProductId(Long productId) {
        return visaMaterialRequirementMapper.selectByProductId(productId);
    }

    /**
     * 根据产品ID和用户类型查询签证材料要求列表
     * @param productId
     * @param userType
     * @return
     */
    @Override
    public List<VisaMaterialRequirement> selectByProductIdAndUserType(Long productId, String userType) {
        // 如果用户类型为空，返回所有材料要求
        if (userType == null || userType.trim().isEmpty()) {
            log.info("产品ID {} 的用户类型为空，返回所有材料要求", productId);
            return visaMaterialRequirementMapper.selectByProductId(productId);
        }
        log.info("根据产品ID {} 和用户类型 {} 查询材料要求", productId, userType);
        return visaMaterialRequirementMapper.selectByProductIdAndUserType(productId, userType);
    }
}
